(1) التعامل مع السلاسل النصيه Strings:-
السلاسل النصيه هى من أهم البيانات التى نتعامل معها فى نظم الحاسب عموماً و فى لغات البرمجه خصوصاً . من الممكن التعامل معها على أنها بعض الأحرف المتتابعه و التعامل معها كما سبق بالدورات و التكرار إعتماداً على أن أى سلسله حرفية تتكون من عدة أحرف معلومة الطول ومتتابعه.ولكن الأسمبلى تمدنا ببعض الدوال التى تسهل علينا هذا التعامل و تقليل التعقيد و طول البرامج نسبياً .
من أهم هذه الدوال ما يلى :- [LODS],[STOS],[MOVS],[INS],[OUTS],[SCAS],[CMPS]
قبل البدء خذ إنتباهك من الأتى :-
- DI ( Data Index/Distination Index ) is combined with the ES (Extra Segment) to reach the data place in memory which the distenation od data of the current string transfer instruction.
- SI ( Stack Index/Source Index ) is combined with the DS (Data Segment) to reach the data place in memory which the source of data of the current string transfer instruction.
- D (Direction Flag) which indecates the direction of the flow of the strings in the memory .
- At D=0 then Auto-Increment will occur to DI,SI According to the size of the current data (Increment with 1 if byte,2 if word,4 if double word).
- At D=1 then Auto-Decrement will occur to DI,SI According to same previous charactaristics.
- [STD] Will Set the Direction Flag (D=1).
- [CLD] Will Clear the Direction Flag (D=0).
- You can't move a Immediate Value to Any Segment Register , So you Should First Move The Desired Value To AX and Hence,Move it Form AX to THE Segment.
|
سنتناول هذه الدوال بالتفصيل مع شرح أمثله :-
[LODS]
هذه الداله يمكنها التعامل مع أحجام من البيانات مختلفه مثلاً [LODSB] لنقل بايت , [LODSW] لنقل كلمه , [LODSD] لنقل كلمتان DOUBLE WORD .
- [LODSB] :- تنقل إلى AL محتويات المكان فى الذاكره المعنون ب [DS:[SI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بواحد مما يعنى أنها تقوم بالتالى : AL=DS:[SI] , SI = SI +- 1 .
- [LODSW] :- تنقل إلى AX محتويات المكان فى الذاكره المعنون ب [DS:[SI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بإثنان مما يعنى أنها تقوم بالتالى : AX=DS:[SI] , SI = SI +- 2 .
- [LODSD] :- تنقل إلى EAX محتويات الكان فى الذاكره المعنون ب [DS:[SI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بأربعه مما يعنى أنها تقوم بالتالى : EAX=DS:[SI] , SI = SI +- 4 .
من الجدير بالذكر :-
|
هناك داله للتكرار فى التعامل مع السلاسل النصيه تسمى [REB] , هذه الداله تعمل تكرار مثل LOOP بالضبط وتكرر عدد مرات ما فى CX ولها أيضاً حالات خاصه كتكرار بشرط مثل [REBE]/[REBNE] . ويمكن و ضع أسم الداله أمامها فقط مثل :- [REP STOSW] ولاحظ أن هذا الموضوع ينفع مع كل الدوال المذكوره أعلاه ماعدا [LODS]
|
مثال:-
;---------------------------------
CLD
MOV AX,0000H
MOV DS,AX ;نحدد المقطع الذى نتعامل معه الأول
MOV CX,1000H ;تحديد عدد مرات النقل التى سوف تتم
MOV SI,0 ;البدأ من أول مكان داخل المقطع
MOV AH,2H ;التجهيز للطبع
START:
LODSB
MOV DL,AL ;تجهيز الحرف الذى سوف يتم طبعه
INT 21H
REP START
END :
;---------------------------------
فى المثال : تم طبع أول 1000 حرف فى الذاكره و طبعاً الموضوع مش عايز تفسيير أكثر من كده .
[STOS]
هذه الداله تتعامل أيضاً مع الأنواع المذكوره أعلاه و بنفس الطريقه .مثل:-
- [STOSB] :- تنقل محتويات ال AL إلى المكان فى الذاكره المعنون ب [ES:[DI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بواحد مما يعنى أنها تقوم بالتالى : ES:[DI]=AL , DI = DI +- 1 .
- [STOSW] :- تنقل محتويات ال AX إلى المكان فى الذاكره المعنون ب [ES:[DI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بإثنان مما يعنى أنها تقوم بالتالى : ES:[DI]=AX , DI = DI +- 2 .
- [STOSD] :- تنقل محتويات ال EAX إلى الكان فى الذاكره المعنون ب [ES:[DI ثم تقوم بزيادة/نقصان(على حسب علم الإتجاه D) ال SI بأربعه مما يعنى أنها تقوم بالتالى : ES:[DI]=EAX , DI = DI +- 4 .
مثال:-
;---------------------------------
CLD
MOV AX ,0B800H
MOV ES,AX ;نحدد المقطع الذى نتعامل معه الأول
MOV DI,0 ;البدأ من أول مكان داخل المقطع
MOV CX,20*80 ;تحديد عدد مرات النقل التى سوف تتم
MOV AX,0720H ;تحميل البيانات التى ستتم نسخها إلى الذاكره
REB STOSW ;تكرار عملية النسخ
END:
;---------------------------------
هذا المثال يقوم بمسح الشاشه (20سطر *80 عمود ) عن طريق نقل القيمه 0720إلى كل الأماكن فى الذاكره التى تبدأ عند ([B800H:0000H]) وهذا المقطع هو مقطع الشاشه و هذا طبعا فى نظام الدوس فقط . ومن الجدير بالذكر هنا أن القيمه 0720 هى عباره عن جزأين , الجزء الأول 07 هو كود اللون الأبيض على الخلفيه السوداء فى نظام الدوس و الجزء الآخر 20H هو الأسكى كود للمسافه الفارغه .
الخلاصه : أننا نطبع فى ذاكره الشاشه المسافه الفارغه فى كل أماكن الشاشه و ذلك لمسح الشاشه بالكامل و هذا المثال مكافىء لأمر الدوس CLS .
[MOVS]
هذه الداله الوحيده فى جميع المعالجات من 8088 إلى بنتيوم 3 التى تسمح بعمليات النقل من مكان فى الذاكره إلى مكان آخر فى الذاكره .
خذ حذرك من الآتى : -
|
لا نستطيع عمل أى عمليات نقل أو غيره بحيث تستلزم من المعالج النظر ألى الذاكره مرتين . يعنى ... This is Not Allowed : ( MOV [1000H],[2000H] ) ( ADD [0903H],[SI] ) ............
|
هذه الداله تعمل مثل سابقتها من حيث مساحات البيانات كما يلى :-
- [MOVSB] :- تستخدم فى نقل بايت من محتويات المكان فى الذاكره المعنون ب [ES:[DI إلى المكان المعنون ب [DS:[SI . ويتم ذيادة ال DI,SI بواحد أو نقصانهم بناءاً على علم الإتجاه D FLAG . مما يعنى أنها تقوم بالأتى : ES:[DI] = DS:[SI] ; SI=SI +-2 ; DI = DI +- 2 .
- [MOVSW] :- تستخدم فى نقل كلمه من محتويات المكان فى الذاكره المعنون ب [ES:[DI إلى المكان المعنون ب [DS:[SI . ويتم ذيادة ال DI,SI بواحد أو نقصانهم بناءاً على علم الإتجاه D FLAG . مما يعنى أنها تقوم بالأتى : ES:[DI] = DS:[SI] ; SI=SI +-2 ; DI = DI +- 2 .
- [MOVSD] :- تستخدم فى نقل كلمتان من محتويات المكان فى الذاكره المعنون ب [ES:[DI إلى المكان المعنون ب [DS:[SI . ويتم ذيادة ال DI,SI بواحد أو نقصانهم بناءاً على علم الإتجاه D FLAG . مما يعنى أنها تقوم بالأتى : ES:[DI] = DS:[SI] ; SI=SI +-2 ; DI = DI +- 2 .
لاحظ : أنها تعمل بتكرار مع الأمر REP.
مثال :-
;---------------------------------
CLD
MOV AX,01000H
MOV DS,AX ;Source Segment
MOV AX,02000H
MOV ES,AX ;Distination Segment
MOV DI,0
MOV SI,0
MOV CX,64 * 1024D
REP MOVSW
END :
;---------------------------------
كما توقعتم , المثال يقوم بنسخ المقطع 1000 بالكامل إلى المقطع 2000 عن طريق تكرار نقل الكلمات عدد 64 KWORDS و هو مساحة المقطع الواحد كما تعلمون .
[INS]
ألم تتساءل أنه من المستحسن أن تكون هناك داله تتعامل مثل الدوال السابقه و تكون مهمتها إدخال أى بيانات من وحدات الإدخال المعروفه (الشاشه / الهارد ديسك مثلا ) .!!؟ هذه الداله تقوم بهذا العمل بتنظيم أكبر و مرونه أكثر و تتيح لك أيضاً التكرار عن طريق إستخدام REP Instruction .
شرح كيفية العمل :
- يتم وضع عنوان وسيلة الإدخال التى سوف تستخدمها فى DX
- تجهيز عنوان المكان فى الذاكره الذى سوف يستقبل البيانات فى [ES:[DI
- تجهيز علم الإتجاه على حسب متطلبات البرنامج .
- إختبار هل توجد بيانات حاضره فى وسيلة الإدخال أولاً قبل طلب هذه البيانات .
- مكافئه للأتى : ES:[DI] = [DX] ; DI = DI +- 1
الداله تمكنك من نقل بايت عن طريق [INSB] , وإدخال كلمه بإستخدام [INSW] , وإدخال كلمتين بإستخدام [INSD] .
مثال :-
;---------------------------------
MOV DI,0
CLD
MOV AX,1000H
MOV ES,AX
MOV DX,3ACH ;عنوان وسيلة الإدخال المستخدمه
MOV CX,100
REP INSB
END :
;---------------------------------
طبعاً سهل !!!.
[OUTS]
نقس طريقة الإدخال و لكن للإخراج و هنا نستخدم لعنوان المكان فى الذاكره موجود فى [DS:[SI كما توقعتم .
مثال :-
;---------------------------------
MOV SI,0
CLD
MOV AX,1000H
MOV DS,AX
MOV DX,3ACH ; عنوان وسيلة الإدخال المستخدمه وليكن عنوان الهارد ديسك
MOV CX,512
REP OUTB
END :
;---------------------------------
المثال يمثل نقل بلوك بيانات من الذاكره [DS:[SI إلى الهارد ديسك .
[SCAS]
هذه الداله تقوم بمقارنة محتويات المكان فى الذاكره الذى عنوانه موجود فى [ES:[DI و محتويات الAL عند إستخدام [SCASB] , ويقارنها بمحتويات ال AX عند إستخدام [SCASW] , ويقارنها بمحتويات ال EAX عند إستخدام [SCASD] .وطبعاً هناك ذياده أو نقصان فى DI كماتعرفنا سابقاً.
مثال :-
;---------------------------------
CLD
MOV DI,0
MOV CX,2000
XOR AX,AX
MOV ES,AX
REBNE SCASW
END :
;سيحتوى على المكان الفارغ أو القصود البحث عنه أو سيحتوى فى حالتنا على 2000 بعد إنتهاء البحث DI
;---------------------------------
فى المثال نبحث فى أول 2000 مكان فى الذاكره عن أول مكان فارغ أو يحتوى على 0000H
[CMPS]
هذه الداله فعلاً عظيمه لأنها تقارن مكانان فى الذاكره فى أمر واحد و تتوقف مساحة هذا المكان على إستخدام الأمر [CMPSB] , [CMPSW] , [CMPSD] .
الأول يوضع فى [ES:[DI.
الثانى يوضع فى [DS:[SI.
مثال
;---------------------------------
CLD
MOV DI,0
MOV SI,0
MOV CX,2000
XOR AX,AX
MOV ES,AX
MOV AX,1000H
MOV DS,AX
REBE CMPSW
END :
;---------------------------------
إلى هنا ينتهى درس الأسمبلى الثامن وتعرفنا على الدوال و الأوامر التى تتعامل مع السلاسل النصيه و أرجو من الله أن يكون سهلاً و بسيطاً و أن يكون قدم شيئاً مفبداً و جديداً لأخواننا الأعزاء.
ولا تنسونى من الدعاء يا أخوانى .
والسلام عليكم و رحمة الله و بركاته
|